#include "main.h"
#include "systick.h"
#include "config.h"
#include "led_app.h"
// #include "uart_drv.h"
#include "aht20.h"

typedef struct
{
    uint8_t run;               // 0: stop, 1: run
    uint16_t timeCount;        // 时间片计数值
    uint16_t timeRload;        // 时间片重载值
    void (*pTaskFuncCb)(void); // 函数指针变量，用来保存业务功能模块函数地址
} TaskComps_t;

static TaskComps_t g_taskComps[] = {
    {0, 500, 500, LedTest},
    // {0, 100, 100, UartDrvTest},
    {0, 1000, 1000, AHT20Task},
    /* 添加业务功能模块 */
};

#define TASK_NUM_MAX (sizeof(g_taskComps) / sizeof(g_taskComps[0]))

static void TaskHandler(void)
{
    for (uint8_t i = 0; i < TASK_NUM_MAX; i++)
    {
        if (g_taskComps[i].run) // 判断时间片标志
        {
            g_taskComps[i].run = 0;       // 标志置0
            g_taskComps[i].pTaskFuncCb(); // 执行调度业务功能模块
        }
    }
}

/**
 * @brief 定时器调度函数
 * @param
 */
static void TaskScheduleCb(void)
{
    for (uint8_t i = 0; i < TASK_NUM_MAX; i++)
    {
        if (g_taskComps[i].timeCount)
        {
            g_taskComps[i].timeCount--;
            if (g_taskComps[i].timeCount == 0)
            {
                g_taskComps[i].run = 1;
                g_taskComps[i].timeCount = g_taskComps[i].timeRload;
            }
        }
    }
}

static void AppInit(void)
{
    AHT20Init();
    TaskScheduleCbReg(TaskScheduleCb);
}

int main(void)
{
    DrvInit();
    AppInit();
    while (1)
    {
        TaskHandler();
    }
}
